package grammar

import (
	"bytes"
	"fmt"
	"goweb/test"
	"strings"
)

func BaseTest() {
	fmt.Println("hello world")
	s := test.Hello()
	fmt.Printf("s: %v\n", s)

	sprint()

	logicTest()

	arr()

	tmap()

	t2for()

	tslice()

	// 声明函数指针
	type fun func(int, int) int
	// 创建函数指针对象
	var f fun
	f = sum
	fmt.Printf("f(1, 4): %v\n", f(1, 4))
	f = add
	fmt.Printf("f(3, 0): %v\n", f(3, 0))

	// 函数高阶
	testHigh("your name", setName)

	// 两个切片拷贝
	sliceAppend()
}

func sprint() {
	// 字符串拼接: strings.Join()
	s := strings.Join([]string{"hello", "tom"}, ",")
	fmt.Printf("s: %v\n", s)

	// 方式2: bytes.Buffer
	var buffer bytes.Buffer
	buffer.WriteString("helllo")
	buffer.WriteString("zhangsan")
	buffer.WriteString(", Good night")
	s2 := buffer.String()
	fmt.Printf("s2: %v\n", s2)
}

func logicTest() {
	a := 100
	a++
	b := a

	// b :=  a++ // 报错
	fmt.Printf("a: %v\n", a)
	fmt.Printf("b: %v\n", b)
}

func arr() {
	var arr = [...]int{1, 2, 4}

	for i, v := range arr {
		fmt.Printf("i: %v\t", i)
		fmt.Printf("v: %v\n", v)
	}
}

// map
func tmap() {
	var data = make(map[string]string, 0)

	data["name"] = "tom"
	data["age"] = "20"
	data["email"] = "陕西西安"

	for key, value := range data {
		fmt.Printf("key: %v\t", key)
		fmt.Printf("value: %v\n", value)
	}
}

// test  break、continue
func t2for() {

	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			if i%2 == 0 && j%2 == 0 {
				continue
			}

			fmt.Printf("i: %v; j: %v\n", i, j)

			if i == 3 && j == 4 {
				// 直接跳出双层循环，跳转到指定LABEL，然后继续往下执行
				goto MYLABEL
			}

		}
	}

	// 定义 label
MYLABEL:
	{
		fmt.Printf("execute  goto index...\n")
	}

	fmt.Printf("out of 2 loop。。。。\n")
}

// 定义切片（动态数组）
func tslice() {
	// 声明切片方式一：无默认值
	var intArr []int
	fmt.Printf("intArr: %v\n", intArr)

	// 声明切片方式二: 默认初始化
	var intArr2 = make([]int, 0)
	fmt.Printf("intArr2: %v\n", intArr2)

	// 切片添加元素
	intArr2 = append(intArr2, 12)
	intArr2 = append(intArr2, 10)
	intArr2 = append(intArr2, 2)
	fmt.Printf("intArr2: %v\n", intArr2)

	// 切片删除元素: 删除下标为2的元素
	var index int = 2
	newArr := append(intArr2[:index], intArr2[index+1:]...)
	fmt.Printf("newArr: %v\n", newArr)

	for i, v := range intArr2 {
		fmt.Printf("i: %v\t v: %v\n", i, v)
	}

	fmt.Printf("------获取所有key--------\n")
	for key := range intArr2 {
		fmt.Printf("key: %v\t", key)
	}
	fmt.Printf("\n")

}

func sum(a int, b int) (result int) {
	return a + b
}

func add(a int, b int) (result int) {
	return a - b
}

// 函数高级: 将函数作为一个参数
func testHigh(name string, f func(string)) {
	f(name)
}

func setName(name string) {
	fmt.Printf("name: %v\n", name)
}

// 切片拷贝
func sliceAppend() {
	s := []int{1, 2}
	s = append(s, 10)

	fmt.Printf("s: %v\n", s)

	s1 := []int{100}

	// ... 进行切片解包
	s = append(s, s1...)
	fmt.Printf("s: %v\n", s)

}
